package com.example.crazyfall;

import org.andengine.engine.Engine;
import org.andengine.ui.IGameInterface.OnCreateSceneCallback;
import org.andengine.engine.handler.timer.ITimerCallback;
import org.andengine.engine.handler.timer.TimerHandler;

//Clase para el control y manejo de las diferentes escenas
public class SceneManager {
	
	
    //Definicion de las diferentes clases como variables
    private BaseScene splashScene;
    private BaseScene menuScene;
    private BaseScene gameScene;
    private BaseScene loadingScene;
    private BaseScene helpScene;
    private BaseScene configurationScene;

    
    // Variables para obtener instancia y la imagen de inicio que es la de splash
    private static final SceneManager INSTANCE = new SceneManager();
    
    private SceneType currentSceneType = SceneType.SCENE_SPLASH;
    
    //Variable para definir la escena del momento
    private BaseScene currentScene;
    
    //Definicion del engine que vamos a usar con la instancia
    private Engine engine = ResorucesManager.getInstance().engine;
    
    //Numera las diferentes escenas
    public enum SceneType
    {
        SCENE_SPLASH,
        SCENE_MENU,
        SCENE_GAME,
        SCENE_LOADING,
        SCENE_HELP,
        SCENE_CONFIGURATION,
    }
    
    //Metodo encargado de setear la escena base del juego
    public void setScene(BaseScene scene)
    {
        engine.setScene(scene);
        currentScene = scene;
        currentSceneType = scene.getSceneType();
    }
    
    //Metodo encargo de setear la escena especifica que se le pida 
    public void setScene(SceneType sceneType)
    {
        switch (sceneType)
        {
            case SCENE_MENU:
                setScene(menuScene);
                break;
            case SCENE_GAME:
                setScene(gameScene);
                break;
            case SCENE_SPLASH:
                setScene(splashScene);
                break;
            case SCENE_LOADING:
                setScene(loadingScene);
                break;
            case SCENE_HELP:
            	setScene(helpScene);
            	break;
            case SCENE_CONFIGURATION:
            	setScene(configurationScene);
            	break;
            default:
                break;
        }
    }
    
    //Metodo que te devuelve la instancia
    public static SceneManager getInstance()
    {
        return INSTANCE;
    }
    
    //Metodo que devuelve el tipo de escena que esta en el momento
    public SceneType getCurrentSceneType()
    {
        return currentSceneType;
    }
    
    // Metodo que devuelve la escena base del momento
    public BaseScene getCurrentScene()
    {
        return currentScene;
    }
   
    // Este metodo genera crear la instace para cargar el logo del tec
    public void createSplashScene(OnCreateSceneCallback pOnCreateSceneCallback)
    {
        ResorucesManager.getInstance().loadSplashScreen();
        splashScene = new SplashScene();
        currentScene = splashScene;
        pOnCreateSceneCallback.onCreateSceneFinished(splashScene);
    }
    
    // Este metodo se usa para quitar el logo del tec
	private void disposeSplashScene()
    {
        ResorucesManager.getInstance().unloadSplashScreen();
        splashScene.disposeScene();
        splashScene = null;
    }

	//Metodo con el cual inicializas la scena Menu
    public void createMenuScene()
    {
        ResorucesManager.getInstance().loadMenuResources();
        menuScene = new MainMenuScene();
        setScene(menuScene);
        disposeSplashScene();
    }
    
    //Metodo el cual inicializas la escena de Configuracion
    public void createConfigScene()
    {
        ResorucesManager.getInstance().loadConfigurationResources();
        configurationScene = new ConfigurationScene();
        setScene(configurationScene);
       // disposeSplashScene();
    }
    
    //Metodo con el que se inicializa la escena de Ayuda
    public void createHelpScene()
    {
        ResorucesManager.getInstance().loadHelpResources();
        helpScene = new HelpScene();
        setScene(helpScene);
      //  disposeSplashScene();
    }

    //Todos los metodos de load tienen partes comentadas que son el codigo para hacer la carga de la pantalla de loading
    
    //Metodo para cargar la escena del juego
    public void loadGameScene(final Engine mEngine)
    {
        ResorucesManager.getInstance().unloadMenuTextures();
      //  gameScene.disposeScene();
        mEngine.registerUpdateHandler(new TimerHandler(0.1f, new ITimerCallback() 
        {
            public void onTimePassed(final TimerHandler pTimerHandler) 
            {
                mEngine.unregisterUpdateHandler(pTimerHandler);
                ResorucesManager.getInstance().loadGameResources();
             //   gameScene = new GameScene();
                setScene(gameScene);
            }
        }));
    }

    //Metodo para carga la escena de configuracion
    public void loadConfigScene(final Engine mEngine)
    {
        ResorucesManager.getInstance().unloadMenuTextures();
        ResorucesManager.getInstance().loadConfigurationResources();
        configurationScene = new ConfigurationScene();
        setScene(configurationScene);
//      //  configurationScene.disposeScene();
//        mEngine.registerUpdateHandler(new TimerHandler(0.1f, new ITimerCallback() 
//        {
//            public void onTimePassed(final TimerHandler pTimerHandler) 
//            {
//                mEngine.unregisterUpdateHandler(pTimerHandler);
//                ResorucesManager.getInstance().loadConfigurationResources();
//                configurationScene = new ConfigurationScene();
//                setScene(configurationScene);
//            }
//        }));
    }
   
    //Metodo para carga la escena de menu desde la escena de configuracion
    public void loadMenuSceneConfi(final Engine mEngine)
    {
    	//menuScene.dispose();
       // ResorucesManager.getInstance().unloadHelpTextures();
       // ResorucesManager.getInstance().unloadConfigTextures();
    	//helpScene.dispose();
    	configurationScene.dispose();
        ResorucesManager.getInstance().loadMenuResources();
        menuScene = new MainMenuScene();
        setScene(menuScene);

//        mEngine.registerUpdateHandler(new TimerHandler(0.1f, new ITimerCallback() 
//        {
//            public void onTimePassed(final TimerHandler pTimerHandler) 
//            {
//                mEngine.unregisterUpdateHandler(pTimerHandler);
//                ResorucesManager.getInstance().loadMenuResources();
//                menuScene = new MainMenuScene();
//                setScene(menuScene);
//            }
//        }));
    }
    
    //Metodo para carga la escena de menu desde la escena de ayuda
    public void loadMenuScene(final Engine mEngine)
    {
    	//menuScene.dispose();
       // ResorucesManager.getInstance().unloadHelpTextures();
       // ResorucesManager.getInstance().unloadConfigTextures();
    	//helpScene.dispose();
    	helpScene.dispose();
        ResorucesManager.getInstance().loadMenuResources();
        menuScene = new MainMenuScene();
        setScene(menuScene);

//        mEngine.registerUpdateHandler(new TimerHandler(0.1f, new ITimerCallback() 
//        {
//            public void onTimePassed(final TimerHandler pTimerHandler) 
//            {
//                mEngine.unregisterUpdateHandler(pTimerHandler);
//                ResorucesManager.getInstance().loadMenuResources();
//                menuScene = new MainMenuScene();
//                setScene(menuScene);
//            }
//        }));
    }

    //Metodo para carga la escena de ayuda
    public void loadHelpScene(final Engine mEngine)
    {
    	
    	//menuScene.dispose();
        ResorucesManager.getInstance().unloadMenuTextures();
        ResorucesManager.getInstance().loadHelpResources();
        helpScene = new HelpScene();
        setScene(helpScene);
       // setScene(helpScene);
//        mEngine.registerUpdateHandler(new TimerHandler(0.1f, new ITimerCallback() 
//        {
//            public void onTimePassed(final TimerHandler pTimerHandler) 
//            {
//                mEngine.unregisterUpdateHandler(pTimerHandler);
//                ResorucesManager.getInstance().loadMenuHelp();
//                helpScene = new HelpScene();
//                setScene(helpScene);
//            }
//        }));
    }
}
